<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对象原型</title>
</head>

<body>

</body>

</html>
<script>
    function Person(name, age) {
        // 将一些可变的属性放入构造函数中 随实例化到实例化后的对象中
        this.name = name
        this.age = age
        // Person.prototype.seyHi = function () {
        //     console.log(`姓名:${this.name}-----年龄:${this.age}`);
        // }
    }
    // 第三种 原型加自变量
    Person.prototype = {
        seyHi: function () {
            console.log(`姓名:${this.name}-----年龄:${this.age}`);
        }

    }
    let newPerson = new Person('张三',28)
    // 推荐使用更改constructor指向的方法
    Object.defineProperty(Person.prototype,"constructor",{
        enumerable: false,
        value : Person
    })
    // 第二种
    let Newperson = new Person('王五', '18')
    Newperson.name = '王五'
    Newperson.job = '搬砖'
    Person.prototype.sex = ['男', '女', '工作']
    Person.prototype.skill = {
        name: '六四'
    }
    console.log(Newperson);
    Newperson.seyHi()
    // 当原型中的属性值是叔祖或对象时 可以通过修改数组索引修改数组的某一项或修改对象的某一些属性值不能整体修改和替换
    Newperson.sex[0] = '女生'
    Newperson.skill.name = '王麻子'
    let Newperson2 = new Person('李四', '20')
    Newperson2.seyHi()
    /*function Person() {}
    Person.prototype.name = "张三";
    Person.prototype.age = 29;
    Person.prototype.seyHi = function(){
        console.log(`姓名${this.name}-----年龄${this.age}`);
    }
    /*
    let Newperson = new Person();
    // 实例化之后 无法通过实例化对象去修改原型中的数据 只能访问
    // Newperson.name = '李四'
    // Newperson.seyHi()
    // 实例化对象Newproto的原型指向构造函数的Proto的原型
    console.log(Newperson.prototype == Person.proto);
    console.log(Newperson.prototype,'-----');
    console.log(Person.proto,'====');
    // instancof constructor 判断数据类型
     */
    // 对象的继承
    console.log('---- apply/call---');
    function Person2(){
        this.job = '敲代码'
    }
    function Person3(name,age){
       // Person2.call(this,name,age) // 改变this指向，后期用逗号隔开可以添加多个参数
        Person2.apply(this,arguments)//后面就收一个参数，这个参数可以是一个数组，或者是一个arguments
        this.name=name
        this.age=age
    }
    let newPerson2 =new Person3('张三',18)
    console.log(newPerson2);

    console.log('---- 构造函数与原型联系---');
    function Person4(){
        this.job = '敲代码'
    }
    function Person5(name,age){
        this.name=name
        this.age=age
    }
    Person5.prototype = new Person4()
    Person5.prototype.constructor = Person5
    let newPerson5 = new Person5('李四',20)
    console.log(newPerson5);

    
</script>